
#include "ListeTempC.h"

ListeTempC * creerListeTC()
{
    ListeTempC * LTC = (ListeTempC*)malloc(1 * sizeof(ListeTempC));
    initListeTempC(LTC);
    return LTC;
}

void initListeTempC(ListeTempC * Liste)
{
	Liste->taille_utilisee = 0;
	Liste->capacite = 1;
	Liste->tab = (Carte *)malloc(sizeof(Carte)*Liste->capacite);
}

void ajouterCarte(ListeTempC * Liste, const Carte * Car)
{
	int i;
	Liste->taille_utilisee++;

	if(Liste->taille_utilisee > Liste->capacite/3)
	{
		Carte *temp = Liste->tab;
		Liste->capacite*=2;
		Liste->tab = (Carte *)malloc(sizeof(Carte)*Liste->capacite);
		for(i=0;i<Liste->taille_utilisee;i++)
			Liste->tab[i] = temp[i];
		free(temp);
	}
	initCarte(&Liste->tab[Liste->taille_utilisee-1]);
	copieCarte(&Liste->tab[Liste->taille_utilisee-1],Car);
}

void testamentListeTempC(ListeTempC * Liste)
{
	int i;
	int j = nbrElementListeC(Liste);
	for(i=j-1;i>=0;i--)
    {
        libereCarte(&Liste->tab[i]);
        Liste->taille_utilisee-=1;
    }
	Liste->taille_utilisee = 0;
	Liste->capacite = 0;
	free(Liste->tab);
}

void detruireListeTempC(ListeTempC ** Liste)
{
    testamentListeTempC(*Liste);
    free(*Liste);
    *Liste = NULL;
}

void supprimerElementListeC(ListeTempC * Liste, int position)
{
	if((position<0)||(position>Liste->taille_utilisee-1))
		exit(EXIT_FAILURE);
	else
	{
		int i;
		if(position < Liste->taille_utilisee-1)
        {
            for(i=position;i<Liste->taille_utilisee-1;i++)
            {
                copieCarte(&Liste->tab[i],&Liste->tab[i+1]);
            }
        }
        libereCarte(&Liste->tab[Liste->taille_utilisee-1]);

		Liste->taille_utilisee--;
		if(Liste->taille_utilisee < Liste->capacite/3)
		{
			Carte *temp = Liste->tab;
			Liste->capacite/=2;
			Liste->tab = (Carte *)malloc(sizeof(Carte)*Liste->capacite);
			for(i=0;i<Liste->taille_utilisee;i++)
				Liste->tab[i] = temp[i];
			free(temp);
		}
	}


}

void initNbrAlea2()
{
    srand(time(NULL));
}

int nbrAleatoire2(const int nbr)
{
	int i;
	i = rand()%nbr;
	return i;
}

int nbrElementListeC(const ListeTempC * liste)
{
    return liste->taille_utilisee;
}

void remplirCarteFichier(FILE * fic, ListeTempC * ListeTC)
{
    int i,j;
    int nbrligne = nbrLigneFichier(fic);
    int nbrC = nbrligne/4;
    int numlign;

    char * ligne;
    Carte * C;
	/*Rempli chaque carte et l'ajoute à la liste temporaire*/
    for(i=0;i<nbrC;i++)
    {
        numlign = i*4+1;
        C = creerCarte();
		/*Rempli le genre*/
        ligne = (char*)malloc(8 * sizeof(char));
        lireLigne(fic, numlign, ligne);
        j = strlen(ligne);
        free(ligne);
        setGenreCarte(C,j-1);
        numlign++;
		/*Rempli le nom*/
        ligne = (char*)malloc(64 * sizeof(char));
        lireLigne(fic, numlign, ligne);
        setNomCarte(C, ligne);
        free(ligne);
        numlign++;
		/*rempli la définition*/
        ligne = (char*)malloc(128 * sizeof(char));
        lireLigne(fic, numlign, ligne);
        setDefinitionCarte(C,ligne);
        free(ligne);
		/*Insertion dans la liste temporaire*/
        ajouterCarte(ListeTC,C);
        detruireCarte(&C);
    }
}

void testRegressionLTC()
{
    int i,j;
    char *ligne1;
	ligne1 = "Carte1";
    char *definition1;
	definition1 = "Définition1";
    char *ligne2;
	ligne2 = "Carte2";
    char *definition2;
	definition2 = "Définition2";
    char *ligne3;
	ligne3 = "Carte3";
    char *definition3;
	definition3 = "Définition3";
    printf("** Test de regression : Liste temporaire de Cartes **\n");
	/** On initialise la liste et les cartes*/
    ListeTempC * liste;
	liste = creerListeTC();
    printf("* Liste temporaire initialisée *\n");
    Carte * C1;
	C1 = creerCarte();
    Carte * C2;
	C2 = creerCarte();
    Carte * C3;
	C3 = creerCarte();
    Carte * C4;
	C4 = creerCarte();
    printf("* Questions initialisées *\n");
	/** On remplit les cartes*/
    setNomCarte(C1,ligne1);
    setDefinitionCarte(C1,definition1);
    setGenreCarte(C1,0);
    setNomCarte(C2,ligne2);
    setDefinitionCarte(C2,definition2);
    setGenreCarte(C2,1);
    setNomCarte(C3,ligne3);
    setDefinitionCarte(C3,definition3);
    setGenreCarte(C3,2);
    printf("* Questions remplies *\n");
	/** On ajoute les cartes à la liste temporaire*/
    ajouterCarte(liste,C1);
    ajouterCarte(liste,C2);
    ajouterCarte(liste,C3);
    i = nbrElementListeC(liste);
    printf("* Il y a %d cartes dans la liste temporaire *\n", i);
	/** On cherche le nombre de question contenue dans la liste*/
    initNbrAlea2();
    j = nbrAleatoire2(i);

    printf("* On va afficher la carte n°%d (tiré aléatoirement) *\n", j+1);
	/** On affiche la question tirée aléatoirement*/
    copieCarte(C4, &liste->tab[j]);
    assert(C4->nom != NULL);
    printf(" -> %s : %s\n", C4->nom, C4->definition);
	/** On supprime LA question tirée aléatoirement puis on recalcule le nombre de question dans la liste*/
    detruireCarte(&C4);

    C4 = creerCarte();
    supprimerElementListeC(liste,j);
    i = nbrElementListeC(liste);
    j = nbrAleatoire2(i);
    assert(i == 2);
    copieCarte(C4, &liste->tab[j]);
    printf("* Puis la question restante *\n -> %s : %s\n", C4->nom, C4->definition);
	/** On vide entièrement la liste et on libère le tableau de la liste ET les cartes*/
    printf("* Libération liste temporaire...");
    detruireListeTempC(&liste);
    printf(" okay *\n");
    printf("* Libération questions...");
    detruireCarte(&C1);
    detruireCarte(&C2);
    detruireCarte(&C3);
    detruireCarte(&C4);
    printf(" okay *\n");

    printf("* Test regression liste temporaire de question : okay! *\n\n");
}
